在Linux命令行中删除具有特定扩展名的文件

您所在的位置:网站首页 rm 后缀 在Linux命令行中删除具有特定扩展名的文件

在Linux命令行中删除具有特定扩展名的文件

2024-07-13 19:52| 来源: 网络整理| 查看: 265

在Linux命令行中删除具有特定扩展名的文件

以下是在 Linux 命令行中根据文件扩展名删除文件的几种方法。还要学习一些在此过程中要小心的技巧。

您可能会遇到这样的情况:您想要删除具有特定扩展名的多个文件。本教程将帮助您做到这一点。

您可以使用 rm 命令按以下方式删除文件和文件夹:

rm [option] filename

您可能看起来需要知道此处的确切文件名,但事实并非如此。

让我向您展示几种根据文件扩展名删除多个文件的方法。

方法一:使用rm命令按扩展名删除文件

在我的示例中,我有一堆以 .gif 扩展名结尾的 gif 文件。

要删除它们,我可以使用 rm 命令,如下所示:

rm *.gif

像这样盲目删除文件可能存在风险。首先使用 ls 命令查看将删除哪些文件总是好的:

ls *.gif

以下是删除扩展名为 .gif 的文件的方法:

$ ls 1.gif 2.gif 3.gif 4.gif a.jpg b.png c.webp $ ls *.gif 1.gif 2.gif 3.gif 4.gif $ rm -v *.gif removed '1.gif' removed '2.gif' removed '3.gif' removed '4.gif' $ ls a.jpg b.png c.webp

可以对任何文件扩展名执行此操作,而不仅仅是 .gif。您甚至可以组合多个扩展。

$ ls f1.txt f2.txt f3.txt f4.txt not-txt-file.pdf random.txt $ rm -v *.txt *.pdf removed 'f1.txt' removed 'f2.txt' removed 'f3.txt' removed 'f4.txt' removed 'not-txt-file.pdf' $ ls random.txt💡您可以将交互式 -i 选项与 rm 命令一起使用,要求在删除每个文件之前进行确认。但是,如果您有大量文件要删除,这可能不太方便。想知道它是如何工作的?通配符!

简而言之,通配符是用于匹配特定模式的特殊字符。以下是一些经常使用的通配符:

*

匹配一次或多次出现

?

匹配单个出现的情况

[]      (Square brackets)

指定匹配范围

^

从匹配中排除

您在此处使用了 * 通配符,这意味着它可以匹配任意字符的一次或多次出现。

当您说 *.gif 时,它表示通向 .gif 的任意字母组合。换句话说,它为您提供扩展名为 .gif 的所有文件。

除了一个通配符之外,还可以使用每个通配符。但我们现在不讨论这些细节。

* 和扩展名之间的点很重要!

许多人犯了将*.gif 与*gif 混淆的错误。这个不对。 * 和扩展名之间的点 (.) 至关重要。

以包含以下文件的场景为例,看看当我使用正则表达式 *gif 而不是 *.gif 时会发生什么:

$ ls 1.gif 2.gif 3.gif 4.gif definately-not-a-gif jpg-not-gif not-a-gif $ rm -v *gif removed '1.gif' removed '2.gif' removed '3.gif' removed '4.gif' removed 'definately-not-a-gif' removed 'jpg-not-gif' removed 'not-a-gif'

它还删除了其中包含字符串 gif 的文件,即使它不是文件的扩展名,它只是在文件名末尾有 gif ,没有前面的点。

当您删除带有通配符或正则表达式的文件时,请确保尽可能精确。

方法二:使用find命令递归删除特定扩展名的文件

rm 命令仅删除当前目录中的文件。即使使用递归选项,它也不会从子目录中删除文件。

要递归删除具有特定扩展名的文件,可以结合使用 find 命令和 rm 命令:

这是一个示例,其中子目录中也有 .gif 文件。

$ ls * file_0.gif file_z.txt not-a-gif not-a-txt dir1: file_1.gif file_a.txt not-a-gif not-a-txt dir2: file_2.gif file_b.txt not-a-gif not-a-txt dir3: file_3.gif file_c.txt not-a-gif not-a-txt dir4: file_4.gif file_d.txt not-a-gif not-a-txt

要删除文件,您可以使用 find 和 exec 命令,如下所示:

find . -type f -name "*.gif" -exec rm -v {} \;

这是我运行命令时的输出:

$ find . -type f -name "*.gif" -exec rm -v {} \; removed './dir1/file_1.gif' removed './dir3/file_3.gif' removed './dir2/file_2.gif' removed './file_0.gif' removed './dir4/file_4.gif

让我们来分解一下。

find后面的句点表示在当前目录中查找

“-name”标志指定文件的名称,我们可以在其中使用正则表达式

“-exec”标志用于对 find 命令的结果执行 bash 命令

“{}”大括号充当匹配文件结果的占位符,因此“rm -v {}”将删除 find 命令找到的文件。

最后,分号结束 shell 执行的命令(exec 之后的命令),并使用反斜杠“\”以便正确转义分号。你不应该担心这个。

您可以在下面的教程中了解 find 命令的更多示例。

高级提示:使用 find 命令处理具有多个扩展名的文件

上面显示的命令不包括查找具有多个扩展名的文件,例如“rm *.gif *.txt”

为此,您可以使用 -o 参数,该参数表示“逻辑 OR 运算符”。但我们还必须使用反斜杠“\”来转义括号

$ ls * file_0.gif file_z.txt not-a-gif not-a-txt dir1: file_1.gif file_a.txt not-a-gif not-a-txt dir2: file_2.gif file_b.txt not-a-gif not-a-txt dir3: file_3.gif file_c.txt not-a-gif not-a-txt dir4: file_4.gif file_d.txt not-a-gif not-a-txt $ find . \( -name "*.gif" -o -name "*.txt" \) -exec rm -v {} \; removed './dir1/file_1.gif' removed './dir1/file_a.txt' removed './dir3/file_3.gif' removed './dir3/file_c.txt' removed './dir2/file_2.gif' removed './dir2/file_b.txt' removed './file_0.gif' removed './file_z.txt' removed './dir4/file_d.txt' removed './dir4/file_4.gif'

在这里,您可以看到所有扩展名为“txt”的文件和扩展名为“gif”的文件都被递归删除。

我知道您会觉得对每种文件扩展名类型单独使用 find 命令会更容易,而且您没有错。

结论

本文介绍了删除具有特定扩展名的文件。我们还研究了递归查找和删除这些文件。

“能力越大,责任越大”,在使用通配符和正则表达式时请记住这一点。一次输入错误,重要的文件可能会被无意中删除。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3